/*
 * 版权所有 (C) 2015 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
*/
package net.redxyz.repost.service.handler;

import org.zhiqim.orm.ORM;

import net.redxyz.repost.service.dao.UserDao;
import net.redxyz.top.ctrl.TaobaoAcccessParameter;
import net.redxyz.top.ctrl.TaobaoAccessHook;
import net.redxyz.top.dbo.user.User;
import net.redxyz.top.message.ErrorResponse;
import net.redxyz.top.message.TaobaoRequest;
import net.redxyz.top.message.TaobaoResponse;

/**
 * 用户错误处理器
 * 1.如果用户，店铺不存在/会话不存在/会话到期，则关闭用户
 * 2.否则保存最新的用户错误日志到用户错误表中
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
public class UserErrHandler implements TaobaoAccessHook
{
    /**
     * 处理淘宝接口失败信息
     * 
     * @param req           淘宝请求
     * @param err           淘宝错误信息
     * @throws Exception    异常
     */
    public <T extends TaobaoResponse> void handle(TaobaoRequest<T> req, ErrorResponse err) throws Exception
    {
        String nick = req.getNick();
        if (nick == null)
        {//没有昵称不处理
            return;
        }
        
        User user = ORM.table().item(User.class, nick);
        if(user != null){
            UserDao.addInvokeApiError(req, err, user.getLastLoginTime());
        }
        
        if (user == null || user.getUserStatus() != 0)
        {//用户不存在,或已过期不处理
            return;
        }
        
        if (err.isUserFail())
        {//用户出错，店铺不存在/会话不存在/会话到期，关闭
            UserDao.doCloseUser(user);
        }
        else
        {//写出错日志到数据库中，一个用户只保存最近一条记录
            UserDao.addUserError(nick, req.getSession(), err.toString(), user.getLastLoginTime());
        }
    }

    @Override
    public boolean isOnece() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void invokeSuccess(TaobaoAcccessParameter<TaobaoRequest<? extends TaobaoResponse>, TaobaoResponse> param) throws Exception {
        
        
    }

    @Override
    public void invokeFailure(TaobaoAcccessParameter<TaobaoRequest<? extends TaobaoResponse>, TaobaoResponse> param) throws Exception {
        handle(param.getReq(), param.getRsp() == null? null: param.getRsp().getError());
    }
}
